package br.ufpe.cin.rgms.base.membro.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;
import br.ufpe.cin.rgms.base.membro.model.Membro;
import br.ufpe.cin.rgms.core.dao.impl.GenericDaoHibernateImpl;


@Component
public class MembroDAO extends GenericDaoHibernateImpl<Membro, Integer> {

	@Override
	protected Class<Membro> getDomainClass() {
		return Membro.class;
	}

	@SuppressWarnings("unchecked")
	public List<Membro> findByName(String nome){
		List<Membro> membros = session.createCriteria(Membro.class)
									 .add(Restrictions.eq("nome", nome))
									 .list();
		return membros;
	}
	
	#if($linhaPesquisa)
	@SuppressWarnings("unchecked")
	public List<Membro> findByResearchLine(Integer researchId) {
		return session.createCriteria(Membro.class)
					  .add(Restrictions.eq("linhaPesquisa.id", researchId))
					  .list();
	}
	#end
	
	@SuppressWarnings("unchecked")
	public List<Membro> findAllByFilter(Membro membro){
		Criteria criteria = session.createCriteria(Membro.class);
		if(membro !=null){
			if(membro.getNome()!=null && !membro.getNome().isEmpty()){
				criteria.add(Restrictions.like("nome", membro.getNome() + "%"));
			}
			if(membro.getSobrenome()!=null && !membro.getSobrenome().isEmpty()){
				criteria.add(Restrictions.like("sobrenome", membro.getSobrenome() + "%"));
			}
			if(membro.getUniversidade()!=null && !membro.getUniversidade().isEmpty()){
				criteria.add(Restrictions.like("universidade", membro.getUniversidade() + "%"));
			}
			if(membro.getDepartamento()!=null && !membro.getDepartamento().isEmpty()){
				criteria.add(Restrictions.like("departamento", membro.getDepartamento() + "%"));
			}
			if(membro.getTipo()!=null && !membro.getTipo().isEmpty()){
				criteria.add(Restrictions.eq("tipo", membro.getTipo()));
			}
			if(membro.getSituacao()!=null && !membro.getSituacao().isEmpty()){
				criteria.add(Restrictions.eq("situacao", membro.getSituacao()));
			}
			if(membro.getEmail()!=null && !membro.getEmail().isEmpty()){
				criteria.add(Restrictions.like("email", membro.getEmail() + "%"));
			}	
		}
		return criteria.list();
		
	}
	
	@SuppressWarnings("unchecked")
	public List<Membro> findByPublication(Integer publicationId) {
		return session.createQuery("from Membro m join m.publicacoes pub where pub.id = ?")
		.setParameter(0,publicationId)
		.list();		

	}		
}
